package qc.module.ehs.api.controller;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.*;
import qc.common.core.constants.QCAuthConstant;
import qc.common.core.exception.QCPromptException;
import qc.module.ehs.dto.unit.*;
import qc.module.ehs.service.EhsUnitInfoService;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * EhsUnitBasicController
 *
 * @author QuCheng Tech
 * @create 2024/5/22
 */
@RestController
@RequestMapping("/unit")
public class UnitController {

    @Autowired
    private EhsUnitInfoService service;

    @Autowired
    HttpServletRequest request;

    @Autowired
    private OrgController orgController;

    /**
     * 查询单元信息，以TreeTable树型形式返回数据
     * 条件组织编码根据token处理获取设置
     *
     * @param condition 查询条件
     * @return List<EhsUnitTreeTableItemDto>
     * @author QuCheng Tech
     * @since 2024/5/30
     */
    @RequestMapping(value = "/treetable",method = {RequestMethod.GET,RequestMethod.POST})
    public List<EhsUnitTreeTableItemDto> queryTreeTable(@RequestBody EhsUnitQueryConditionDto condition) throws QCPromptException {
        if (condition == null)
            throw new QCPromptException("条件不能为空");
        if (StringUtils.isBlank(condition.getOrgcode()))
            throw new QCPromptException("组织代码不能为空");

        List<Integer> deptIds = null;
        //如果查询条件中指定需要根据用户所在部门进行过滤，获取用户所在部门集合
        if (condition.isIsdept() == true) {
            HttpHeaders headers = new HttpHeaders();
            headers.add(QCAuthConstant.TOKEN_HEADER_KEY, request.getHeader(QCAuthConstant.TOKEN_HEADER_KEY));
            headers.add(QCAuthConstant.PROJECT_CODE_HEADER_KEY, request.getHeader(QCAuthConstant.PROJECT_CODE_HEADER_KEY));

            deptIds = orgController.getUserDeptIds(condition.getOrgcode(), headers);
        }

        return service.queryTreeTable(condition, deptIds);
    }

    /**
     * 查询单元简要信息
     * 用于在其他模块（如危险源台账）作为查询条件或表单选择数据接口使用；以层级形式返回单元列表（可以根据条件根据用户部门筛选）
     * 
     * @param condition 查询条件
     * @return List<EhsUnitTreeSimpleDto>
     * @throws QCPromptException
     * @author QuCheng Tech
     * @since 2024/5/31
     */
    @RequestMapping(value = "/treesimple",method = {RequestMethod.GET,RequestMethod.POST})
    public List<EhsUnitTreeSimpleDto> queryTreeSimple(@RequestBody EhsUnitQueryConditionDto condition) throws QCPromptException {
        if (condition == null)
            throw new QCPromptException("条件不能为空");
        if (StringUtils.isBlank(condition.getOrgcode()))
            throw new QCPromptException("组织代码不能为空");

        List<Integer> deptIds = null;
        //如果查询条件中指定需要根据用户所在部门进行过滤，获取用户所在部门集合
        if (condition.isIsdept() == true) {
            HttpHeaders headers = new HttpHeaders();
            headers.add(QCAuthConstant.TOKEN_HEADER_KEY, request.getHeader(QCAuthConstant.TOKEN_HEADER_KEY));
            headers.add(QCAuthConstant.PROJECT_CODE_HEADER_KEY, request.getHeader(QCAuthConstant.PROJECT_CODE_HEADER_KEY));

            deptIds = orgController.getUserDeptIds(condition.getOrgcode(), headers);
        }

        return service.queryTreeSimple(condition, deptIds);
    }

    /**
     * 查询单元信息，以List形式返回数据
     * 条件组织编码根据token处理获取设置
     *
     * @param condition 查询条件
     * @return List<EhsUnitTreeTableItemDto>
     * @author QuCheng Tech
     * @since 2024/5/23
     */
    @RequestMapping(value = "/list",method = {RequestMethod.GET,RequestMethod.POST})
    public List<EhsUnitDto> queryList(@RequestBody EhsUnitQueryConditionDto condition) throws QCPromptException {
        if (condition == null)
            throw new QCPromptException("条件不能为空");
        if (StringUtils.isBlank(condition.getOrgcode()))
            throw new QCPromptException("组织代码不能为空");

        List<Integer> deptIds = null;
        //如果查询条件中指定需要根据用户所在部门进行过滤，获取用户所在部门集合
        if (condition.isIsdept() == true) {
            HttpHeaders headers = new HttpHeaders();
            headers.add(QCAuthConstant.TOKEN_HEADER_KEY, request.getHeader(QCAuthConstant.TOKEN_HEADER_KEY));
            headers.add(QCAuthConstant.PROJECT_CODE_HEADER_KEY, request.getHeader(QCAuthConstant.PROJECT_CODE_HEADER_KEY));

            deptIds = orgController.getUserDeptIds(condition.getOrgcode(), headers);
        }

        return service.queryList(condition, deptIds);
    }

    /**
     * 获取指定 - 同时支持@RequestParam和@PathVariable方式
     *
     * @param id 单元代码
     * @return EhsUnitDto
     * @author QuCheng Tech
     * @since 2024/5/22
     */
    @GetMapping("/get")
    public EhsUnitDto getByParam(@RequestParam String id) throws QCPromptException {
        return service.get(id);
    }

    /**
     * 获取指定 - 同时支持@RequestParam和@PathVariable方式
     *
     * @param id 单元代码
     * @return EhsUnitDto
     * @author QuCheng Tech
     * @since 2024/5/22
     */
    @GetMapping("/get/{id}")
    public EhsUnitDto getByPath(@PathVariable String id) throws QCPromptException {
        return service.get(id);
    }

    /**
     * 新增
     *
     * @param dto 单元信息
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/5/22
     */
    @RequestMapping(value = "/add",method = {RequestMethod.GET,RequestMethod.POST})
    public String add(@RequestBody EhsUnitDto dto){
        return service.add(dto);
    }

    /**
     * 修改 修改时不对单元的责任机制信息（包括责任部门、责任人、安全员）进行设置，赋值传入也无效；
     *
     * @param dto 单元信息
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/5/23
     */
    @RequestMapping(value = "/update",method = {RequestMethod.POST,RequestMethod.PUT})
    public String update(@RequestBody EhsUnitDto dto) {
        return service.update(dto);
    }

    /**
     * 删除 - 同时支持@RequestParam和@PathVariable方式
     *
     * @param id 单元编码
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/5/23
     */
    @DeleteMapping("/delete")
    public String deleteByParam(@RequestParam String id) throws QCPromptException {
        return service.delete(id);
    }

    /**
     * 删除 - 同时支持@RequestParam和@PathVariable方式
     *
     * @param id 单元编码
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/5/23
     */
    @DeleteMapping("/delete/{id}")
    public String deleteByPath(@PathVariable String id) throws QCPromptException {
        return service.delete(id);
    }

    /***
     * 获取指定单元分类中的单元简要信息
     *
     * @param dto 查询条件
     * @return java.util.List<qc.module.ehs.dto.unit.EhsUnitSimpleDto>
     * @author QuCheng Tech
     * @since 2025/1/15
     */
    @RequestMapping(value = "/categorysimple", method = {RequestMethod.POST, RequestMethod.GET})
    public List<EhsUnitSimpleDto> getCategoryUnitSimpleByParam(@RequestBody EhsUnitCategoryQueryConditionDto dto) throws QCPromptException {
        if (dto == null)
            throw new QCPromptException("查询条件对象不能为空");
        if (StringUtils.isBlank(dto.getOrgcode()))
            throw new QCPromptException("查询条件中的组织代码不能为空");
        if (StringUtils.isBlank(dto.getUccd()))
            throw new QCPromptException("查询条件中的单元分类编码不能为空");

        return service.getUnitSimpleByCategoryCode(dto.getOrgcode(), dto.getUccd());
    }
}
